class Lady_class {
  content = 'hi'
  sayHello() {
    return this.content
  }
}

class xjj_lady_class extends Lady_class {
  sayLove() {
    return 'love'
  }
  sayHello() { // 重写
    return super.sayHello() + ' hello'
  }
}

const goddess = new xjj_lady_class()
console.log(goddess.sayHello(), goddess.sayLove())

// 类的内部和类的外部
// 1、public：public表明该数据成员、成员函数是对所有用户开放的，所有用户都可以直接进行调用
// 2、private：private表示私有，私有的意思就是除了class自己之外，任何人都不可以直接使用。
// 3、protected：protected对于子女、朋友来说，就是public的，可以自由使用，没有任何限制，而对于其他的外部class，protected就变成private。
class Person_class {
  protected name!: string;
  public sayHello() {
    console.log(`${this.name} Hello`)
  }
}

class Teach_class extends Person_class {
  public sayBye() {
    this.name
  }
}

const person = new Teach_class()
// person.name = 'ladygg'
// console.log(person.name)
person.sayHello()

// 类的构造函数 子类构造函数里面必须写super()

class Person_constructor { }

class Teach_constructor extends Person_constructor {
  constructor(public age: number) {
    super()
  }
}

const person_constructor_1 = new Teach_constructor(18)
console.log(person_constructor_1)

// 类的属性保护

class xjj_class_pri {
  constructor(private _age: number) { }
  get age() {
    return this._age - 10
  }
  set age(age: number) {
    this._age = age
  }
}

const djj_pri = new xjj_class_pri(28)
console.log(djj_pri.age)
djj_pri.age = 99
console.log(djj_pri.age)

// statc 只读属性，静态类

class Girl_class {
  static sayLove() {
    return 'love'
  }
  public readonly _name!: string
  constructor(name: string) {
    this._name = name
  }
}

console.log(Girl_class.sayLove())

const girl_1 = new Girl_class('lldd')
console.log(girl_1._name)

// 抽象类

abstract class Girl_waiter {
  abstract skill(): any
}

class Waiter extends Girl_waiter {
  skill() {
    console.log('倒水')
  }
}
class BaseWaiter extends Girl_waiter {
  skill() {
    console.log('推拿')
  }
}
class SeniorWaiter extends Girl_waiter {
  skill() {
    console.log('spa')
  }
}